package com.example.group.network.express_plus_app.ui.home;

import android.app.Application;
import android.util.Log;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.example.group.network.express_plus_app.R;

import com.example.group.network.express_plus_app.UpdateNetNameActivity;
import com.example.group.network.express_plus_app.bean.MyResponse;
import com.example.group.network.express_plus_app.bean.Order;
import com.example.group.network.express_plus_app.data.model.LoggedInUser;
import com.example.group.network.express_plus_app.http.GsonArrayRequest;
import com.example.group.network.express_plus_app.http.GsonRequest;
import com.example.group.network.express_plus_app.http.MySingleton;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * MVVM架构
 * 数据和业务逻辑处于一个独立的ViewModel中，ViewModel只需要关注数据和业务逻辑
 * ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。
 * LiveData 是一种可观察的数据存储器类。与常规的可观察类不同，LiveData
 * 具有生命周期感知能力，意指它遵循其他应用组件（如 Activity、Fragment 或 Service）的生命周期。
 * 这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
 */
public class HomeViewModel extends AndroidViewModel {
    String server_ip ;
    private MutableLiveData<ArrayList<Order>> orderMutableLiveData;
    RequestQueue queue;

    public HomeViewModel(@NonNull Application application) {
        super(application);
        orderMutableLiveData = new MutableLiveData<ArrayList<Order>>();
        queue= MySingleton.getInstance(application).getRequestQueue();

        server_ip=getApplication().getString(R.string.server_ip);
    }


    /**
     * MutableLiveData的父类是LiveData
     * LiveData在实体类里可以通知指定某个字段的数据更新；
     * MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段。
     * @return
     */
    public LiveData<ArrayList<Order>> getText() {
        return orderMutableLiveData;
    }

    //根据快递详细地址和快递种类请求列表数据
    public void findOrderByExpressDetailAddressAndExpressType(
            String expressDetailAddress,String expressType){

        String url=server_ip+"express-order/open-order/find-orders-by-express-detail-address?expressDetailAddress="
                +expressDetailAddress+"&expressType="+expressType;
        System.out.println(server_ip);
        GsonArrayRequest gsonArrayRequest=new GsonArrayRequest(url, Order.class, null, new Response.Listener<ArrayList<Order>>() {
            @Override
            public void onResponse(ArrayList<Order> response) {
                orderMutableLiveData.setValue(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.i("出错", String.valueOf(error.getNetworkTimeMs()));
            }
        });

        gsonArrayRequest.setRetryPolicy(new DefaultRetryPolicy(6000,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        queue.add(gsonArrayRequest);

    }

}